package com.sxj.corejava.code11_io.字节流;

import java.io.*;

/**
 * @author 石小俊
 * @date 2025年02月21日
 */
public class Test01_文件字节输入流 {

    public static void main(String[] args) {
        test03();
    }

    public static void test01() {
        File file = new File("corejava/src/user.properties");
//        File file = new File("corejava/src/aa.txt");
        FileInputStream in = null;
        try {
            in = new FileInputStream(file);

            // read():从输入流中读取一个数据字节
//            System.out.println(in.read());
//            System.out.println((char)(in.read()));
//            System.out.println((char)(in.read()));
//            System.out.println((char)(in.read()));
//            System.out.println((char)(in.read()));
//            int data = in.read();
//            while (data != -1) {
//                System.out.print((char) data);
//                data = in.read();
//            }
            // 简写方式
            int data = -1;
            while ((data = in.read()) != -1) {
                System.out.print((char) data);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 释放流,凡是开发者开启的流,最终都需要释放
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 在JDK7开始,支持自动释放资源
     */
    public static void test02() {
        try (
                // 所有需要释放的资源都可以在此处进行获取
                // 此时获取的流会在结束后自动进行释放
                // 此处的类存在要求:必须实现了AutoCloseable接口
                // 简单来讲:此处创建的对象会进行自动释放
                FileInputStream in = new FileInputStream("corejava/src/user.properties");
//                FileInputStream in = new FileInputStream("corejava/src/aa.txt");
        ) {
            // 该方式只支持一个字节一个字节的读取,对于中文无法识别
//            int data = -1;
//            while ((data = in.read()) != -1) {
//                System.out.print((char) data);
//            }

            // 可以考虑一次读取多个字节
//            byte[] b = new byte[3];
            byte[] b = new byte[1024];
            int data = -1;
            while ((data = in.read(b)) != -1) {
                // 参数一:需要转换的字节数组
                // 参数二:从哪一个索引位置开始转换
                // 参数三:转换多少个字节
                System.out.print(new String(b, 0, data));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 路径用法
     */
    public static void test03(){
        try (
                // 支持相对路径
//                FileInputStream in = new FileInputStream("corejava/src/user.properties");
                // 支持绝对路径
//                FileInputStream in = new FileInputStream("E:\\test\\a.txt");
                // 支持类加载路径
                InputStream in = Test01_文件字节输入流.class.getClassLoader().getResourceAsStream("aa.txt");
        ) {
            byte[] b = new byte[1024];
            int data = -1;
            while ((data = in.read(b)) != -1) {
                // 参数一:需要转换的字节数组
                // 参数二:从哪一个索引位置开始转换
                // 参数三:转换多少个字节
                System.out.print(new String(b, 0, data));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
